package main

// <-------------------------------  json 处理部分 ------------------------------------->
import (
	"crypto/hmac"
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"sort"
)

/*
	功能：实现hma_md5 签名
	参数：1. key   数据库中获取的密钥
		2. data   拼接好的信息
	返回值：1. 签名
*/
func Hmac(key, data string) string {
	hmac := hmac.New(md5.New, []byte(key))
	hmac.Write([]byte(data))
	return hex.EncodeToString(hmac.Sum([]byte("")))
}

/*
	功能：将[]byte类型的json，转换程map[string]string
	参数：1. bodyContent  收到的json []byte类型
	返回指： 1. map5 转换完成map
			2. myerr json获取失败时，为非空
*/
func getMapFromJson(bodyContent []byte) (map[string]string, error) {
	var map4 map[string]interface{}
	var map5 = make(map[string]string)
	err := json.Unmarshal(bodyContent, &map4)
	var myerr error
	if err != nil {
		println("unJsonerr:", err)
		myerr = err
	} else {
		for k, v := range map4 {
			map5[k] = fmt.Sprintf("%v", v)
		}
	}
	return map5, myerr
}

/*
	功能：读取收到的json，并且将json转换为map
	参数：	1. bodyContent  收到的json []byte类型
	返回指：1. result	对map排好序(排除sign)，并且拼接
		   2. oldMap   (含有sign)的原来的map
		   3. myerr	   json获取失败时，为非空
*/
func read_json(bodyContent []byte) (string, map[string]string, error) {

	var myerr error
	newMap, err1 := getMapFromJson(bodyContent)
	if err1 != nil {
		myerr = err1
	}
	oldMap, err2 := getMapFromJson(bodyContent)
	if err2 != nil {
		myerr = err2
	}

	delete(newMap, "sign")

	//1.定义一个slice
	s1 := make([]string, 0, len(newMap))

	//2.遍历map获取key-->s1中
	for key := range newMap {
		s1 = append(s1, key)
	}

	//3.给s1进行排序
	sort.Strings(s1)

	var result string
	for _, k := range s1 {
		result += k
		result += newMap[k]
	}

	return result, oldMap, myerr
}
